﻿/**
 * @file Framework.h
 * @brief SSD仿真系统主框架类，负责各核心模块的初始化与调度。
 */
#ifndef __Framework_h__
#define __Framework_h__

#include <queue>
#include <exception>
#include <string>
#include "Buffer/Hal/BufferHal.h"
#include "Nand/Hal/NandHal.h"
#include "FirmwareCore.h"
#include "HostComm/Ipc/MessageServer.hpp"
#include "HostComm/CustomProtocol/CustomProtocolCommand.h"
#include "HostComm/CustomProtocol/CustomProtocolHal.h"

class JSONParser;

/**
 * @class SimFrameworkCommand
 * @brief 仿真主框架命令结构体。
 */
class SimFrameworkCommand
{
public:
    /**
     * @enum Code
     * @brief 框架命令类型枚举。
     */
    enum class Code
    {
        Exit,            /**< 退出仿真 */
        DataOutLoopback, /**< 主机数据输出回环 */
        DataInLoopback,  /**< 主机数据输入回环 */
    };

    Code Code; /**< 命令类型 */
};

/**
 * @class Framework
 * @brief SSD仿真系统主框架类，负责各核心模块的初始化与调度。
 */
class Framework
{
public:
    /**
     * @class Exception
     * @brief 框架异常类。
     */
    class Exception : public std::exception
    {
    public:
        /**
         * @brief 构造函数，初始化异常信息。
         * @param errMesg 异常信息字符串
         */
        Exception(std::string errMesg) : _ErrMesg(errMesg) {}
        /**
         * @brief 获取异常信息。
         * @return 异常信息字符串
         */
        const char *what() const noexcept { return _ErrMesg.c_str(); }

    private:
        std::string _ErrMesg; /**< 异常信息 */
    };

public:
    /**
     * @brief 构造函数。
     */
    Framework();
    /**
     * @brief 初始化仿真框架。
     * @param nandConfigFilename NAND配置文件名
     * @param ipcNamesPrefix IPC名称前缀（可选）
     */
    void Init(const std::string &nandConfigFilename, std::string ipcNamesPrefix = "");

public:
    /**
     * @brief 框架主循环入口。
     */
    void operator()();

private:
    /**
     * @brief 初始化NAND硬件抽象层。
     * @param parser JSON配置解析器
     */
    void SetupNandHal(JSONParser &parser);
    /**
     * @brief 初始化缓冲区管理器。
     * @param parser JSON配置解析器
     */
    void SetupBufferHal(JSONParser &parser);
    /**
     * @brief 获取固件核心信息。
     * @param parser JSON配置解析器
     */
    void GetFirmwareCoreInfo(JSONParser &parser);

private:
    /**
     * @enum State
     * @brief 框架运行状态枚举。
     */
    enum class State
    {
        Start, /**< 启动 */
        Run,   /**< 运行 */
        Exit   /**< 退出 */
    };

    State _State; /**< 当前框架状态 */

private:
    std::shared_ptr<MessageServer<SimFrameworkCommand>> _SimServer;        /**< 仿真主消息服务器 */
    std::shared_ptr<MessageServer<CustomProtocolCommand>> _ProtocolServer; /**< 自定义协议消息服务器 */
    std::shared_ptr<BufferHal> _BufferHal;                                 /**< 缓冲区管理器 */
    std::shared_ptr<NandHal> _NandHal;                                     /**< NAND硬件抽象层 */
    std::shared_ptr<CustomProtocolHal> _CustomProtocolHal;                 /**< 自定义协议处理模块 */
    std::shared_ptr<FirmwareCore> _FirmwareCore;                           /**< 固件核心模块 */
    std::string _RomCodePath;                                              /**< ROM代码路径 */
};

#endif
